/*
 * @Author: “ygnnli” “1585923072@qq.com”
 * @Date: 2024-08-09 21:18:05
 * @LastEditors: “ygnnli” “1585923072@qq.com”
 * @LastEditTime: 2024-08-10 10:33:14
 * @FilePath: /83/Reactor/PackageParse.hpp
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#pragma once

#include <iostream>
#include "Connection.hpp"
#include "Protocol.hpp"
#include "CalCulate.hpp" // 业务处理

using namespace protocol_ns;

// 报文解析类
class PackageParse
{
public:
    static void Parse(Connection *conn)
    {
        // std::cout<<"inbuffer: "<<conn->Inbuffer()<<std::endl;

        // 2. 分析数据，确认完整报文
        std::string package; // 存储完整报文
        Request req;         // 存储反序列化后的数据
        CalCulate cal;       // 业务处理
        while (1)
        {
            std::cout << "conn->Inbuffer(): " << conn->Inbuffer() << std::endl; // 打印缓冲区数据
            conn->AppendOutBuffer(conn->Inbuffer());                            // 将缓冲区数据添加到发送缓冲区
            break;

            // package = Decode(conn->Inbuffer()); // 解码
            // if (package.empty())
            //     break; // 如果解码失败，则跳出循环

            // std::cout << "---------------begin----------------" << std::endl;

            // std::cout << "resq string: \n"
            //           << package << std::endl; // 打印接收到的一串完整编码

            // // 得到了一个完整的包
            // // 我敢保证，你一定读到了一个完整的json串.
            // // 3.反序列化
            // req.Deserialize(package); // 反序列化

            // // 4. 业务处理
            // Response resp = cal.Excute(req);

            // // 5. 对应答做序列化
            // std::string send_str;
            // resp.Serialize(&send_str);

            // std::cout << "resp Serialize: " << std::endl;
            // std::cout << send_str << std::endl; // 打印序列化后的数据

            // // 6. 添加长度报头
            // send_str = Encode(send_str);
            // std::cout << "resp Encode: " << std::endl;
            // std::cout << send_str << std::endl; // 打印序列化后的数据

            // conn->AppendOutBuffer(send_str); // 添加到发送缓冲区
        }
        if (!conn->OutbufferEmpty() && conn->_sender != nullptr)
        {
            // conn->_sender(conn); // 方法一：发送数据

            conn->_R->EnableReadWrite(conn->Sockfd(), true, true); // 方法二：发送数据
        }
    }
};